package com.jiashihui.web.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jiashihui.web.config.datasource.DataSource;
import com.jiashihui.web.config.datasource.DataSourceEnum;
import com.jiashihui.web.mapper.DeptMapper;
import com.jiashihui.web.model.Dept;
import com.jiashihui.web.service.IDeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author jiashihui
 * @since 2019-01-29
 */
@Service
@Slf4j
public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements IDeptService {

    @Resource
    private DeptMapper deptMapper;

    //@CachePut(value = "dept", key = "#entity.name", condition = "#result ne null")
    @Override
    @DataSource(DataSourceEnum.DB2)
    public Dept getById(Serializable id) {
        return super.getById(id);
    }

    @Override
    public List<Dept> queryUserList(Dept dept){
        return deptMapper.selectList(new QueryWrapper(dept));
    }

    @Override
    @Transactional
    public boolean updateById(Dept entity) {
        boolean result = super.updateById(entity);
        try {
            throw new Exception();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

/**
 * @事务是一系列的动作，它们综合在一起才是一个完整的工作单元，这些动作必须全部完成，如果有一个失败的话，那么事务就会回滚到最开始的状态，仿佛什么都没发生过一样。
 * ACID (原子性、一致性、隔离性、持久性）
 * @Transactional的Isolation属性可以指定事务的隔离级别。但事务的隔离级别是由底层的数据库实现的，并不是由Spring来实现。
 * 1.ISOLATION_DEFAULT ,这是默认的隔离级别，使用数据库默认的事务隔离级别.
 * 2.ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别，它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读，不可重复读和幻像读。
 * 3.ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现，但是可能会出现不可重复读和幻像读。
 * 4.ISOLATION_REPEATABLE_READ这种事务隔离级别可以防止脏读，不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。
 * 5.ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读，不可重复读外，还避免了幻像读。
 *
 * @事务管理器
 * Spring并不直接管理事务，而是提供了多种事务管理器，他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
 * Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager，通过这个接口，Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器，但是具体的实现就是各个平台自己的事情了。
 * 此接口的内容如下：
 * Public interface PlatformTransactionManager()...{
 *   // 由TransactionDefinition得到TransactionStatus对象
 *   TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
 *   // 提交
 *   Void commit(TransactionStatus status) throws TransactionException;
 *   // 回滚
 *   Void rollback(TransactionStatus status) throws TransactionException;
 *  }
 */
